home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <math.h>
- #include <values.h>
- #include <X11/StringDefs.h>
- #include <X11/Intrinsic.h>
- #include <Xm/Xm.h>
- #include <Xm/DrawingA.h>
- #include <X11/Xutil.h>
- #include <X11/cursorfont.h>
- #include "defs.h"
- #include "funcs.h"
- #include "icon.h"
- #include "macro.h"
-
- typedef struct points_t {
- XPoint data[MAXCOLOR][MAXPOINTS];
- int npoints[MAXCOLOR];
- } points_t;
-
- static void SetCursorColors(image_data_t *data);
- static void UsageMessage(image_data_t *data);
- static void NewColormap(image_data_t *data, int color);
- static void FlipRotate(image_data_t *data);
- static void KeyPressFunc(Widget w, image_data_t *data, XEvent *event);
- static GC CreateXorGC(Widget w);
- static void StartRubberBand(Widget w, image_data_t *data, XEvent *event);
- static void SetupCorners(XPoint *corners, image_data_t *data);
- static void TrackRubberBand(Widget w, image_data_t *data, XEvent *event);
- static void EndRubberBand(Widget w, image_data_t *data, XEvent *event);
- static void InitData(Widget toplevel, Widget w, image_data_t *data);
- static void HalfIntensity(unsigned short *color);
- static void SetupStripeCmap(image_data_t *data, XColor *colors);
- static void SetupRainbow(int ncells, XColor *colors);
- static void HLSToRGB(int *hue_light_sat, int *rgb);
- static double HueValue(double n1, double n2, double hue);
- static void Redisplay(Widget w, image_data_t *data,
- XmDrawingAreaCallbackStruct *call_data);
- static void Resize(Widget w, image_data_t *data, caddr_t call_data);
- static Boolean RotateWorkProc(image_data_t *data);
- static void SetupMonoCmap(image_data_t *data, XColor *colors, int i_inc);
- static void NoGreenCmap(image_data_t *data, XColor *colors);
- static void NewRotateJumpCount(image_data_t *data, int count);
-
- static points_t *Points;
-
- static XtResource Resources [] = {
- {"width", "Width", XtRInt, sizeof(Dimension), XtOffset(image_data_ptr_t,
- width), XtRString, "200"},
- {"height", "Height", XtRInt, sizeof(Dimension),
- XtOffset(image_data_ptr_t, height), XtRString, "200"},
- {"mdepth", "MDepth", XtRInt, sizeof(int), XtOffset(image_data_ptr_t,
- M), XtRString, "1000"},
- {"kvalue", "KValue", XtRInt, sizeof(int), XtOffset(image_data_ptr_t,
- K), XtRString, "128"},
- {"p_min", "P_min", XtRFloat, sizeof(float), XtOffset(image_data_ptr_t,
- ip_min), XtRString, "-2.25"},
- {"p_max", "P_max", XtRFloat, sizeof(float), XtOffset(image_data_ptr_t,
- ip_max), XtRString, "0.75"},
- {"q_min", "Q_min", XtRFloat, sizeof(float), XtOffset(image_data_ptr_t,
- iq_min), XtRString, "-1.5"},
- {"q_max", "Q_max", XtRFloat, sizeof(float), XtOffset(image_data_ptr_t,
- iq_max), XtRString, "1.5"}};
-
- int
- main(
- int argc,
- char *argv[])
- {
- Widget toplevel, area;
- image_data_t data;
- int n;
- Arg wargs[4];
-
- toplevel = XtInitialize(argv[0], "Mandel", (char **)0, 0, &argc, argv);
- XtGetApplicationResources(toplevel, &data, Resources,
- XtNumber(Resources), (char **)0, 0);
- n = 0;
- XtSetArg(wargs[n], XmNminAspectX, 1); ++n;
- XtSetArg(wargs[n], XmNminAspectY, 1); ++n;
- XtSetArg(wargs[n], XmNmaxAspectX, 1); ++n;
- XtSetArg(wargs[n], XmNmaxAspectY, 1); ++n;
- XtSetValues(toplevel, wargs, n);
- area = XtCreateManagedWidget("area", xmDrawingAreaWidgetClass, toplevel,
- (Arg *)NULL, 0);
- n = 0;
- XtSetArg(wargs[n], XtNwidth, 200); ++n;
- XtSetArg(wargs[n], XtNheight, 200); ++n;
- XtSetValues(toplevel, wargs, n);
- InitData(toplevel, area, &data);
- UsageMessage(&data);
- XtAddCallback(area, XmNexposeCallback, Redisplay, &data);
- XtAddCallback(area, XmNresizeCallback, Resize, &data);
- XtAddEventHandler(area, ButtonPressMask, FALSE, StartRubberBand, &data);
- XtAddEventHandler(area, ButtonMotionMask, FALSE, TrackRubberBand,
- &data);
- XtAddEventHandler(area, ButtonReleaseMask, FALSE, EndRubberBand, &data);
- XtAddEventHandler(area, KeyPressMask, FALSE, KeyPressFunc, &data);
- XtRealizeWidget(toplevel);
- data.band_cursor = XCreateFontCursor(XtDisplay(area), XC_hand2);
- XGrabButton(XtDisplay(area), AnyButton, AnyModifier, XtWindow(area),
- TRUE, ButtonPressMask | ButtonMotionMask | ButtonReleaseMask,
- GrabModeAsync, GrabModeAsync, XtWindow(area),
- data.band_cursor);
- data.rubber_band.gc = CreateXorGC(area);
- Points = (points_t *)ALLOCATE_LOCAL(sizeof(points_t));
- XDefineCursor(XtDisplay(area), XtWindow(area), data.normal_cursor);
- n = 0;
- XtSetArg(wargs[n], XmNiconPixmap,
- XCreatePixmapFromBitmapData(XtDisplay(area), XtWindow(area),
- noname_bits, noname_width, noname_height, 1, 0, 1)); ++n;
- XtSetValues(toplevel, wargs, n);
- Resize(area, &data, (caddr_t)0);
- XtMainLoop();
- DEALLOCATE_LOCAL((char *)Points);
- }
-
- static void
- SetCursorColors(
- image_data_t *data)
- {
- unsigned int i, index;
- double red, green, blue, val, max_val;
- XColor bgcolor, fgcolor;
-
- index = 0;
- max_val = 0.0;
- for (i = 0; i < data->max_color; ++i)
- {
- red = data->colors[i].red;
- green = data->colors[i].green;
- blue = data->colors[i].blue;
- val = red * red + green * green + blue * blue;
- if (val > max_val)
- {
- max_val = val;
- index = i;
- }
- }
- bgcolor = data->colors[index];
- fgcolor = data->colors[0];
- XRecolorCursor(XtDisplay(data->area), data->normal_cursor, &fgcolor,
- &bgcolor);
- XRecolorCursor(XtDisplay(data->area), data->clock_cursor, &fgcolor,
- &bgcolor);
- XRecolorCursor(XtDisplay(data->area), data->band_cursor, &fgcolor,
- &bgcolor);
- XFlush(XtDisplay(data->area));
- }
-
- static void
- UsageMessage(
- image_data_t *data)
- {
- printf("\n\t\tMandelbrot Generator\n\n");
- printf("Select area to be investigated with mouse\n");
- printf("Keyboard:\n");
- printf("\t 'r' - use red colormap\n");
- printf("\t 'g' - use green colormap\n");
- printf("\t 'b' - use blue colormap\n");
- printf("\t 'm' - use mono colormap\n");
- printf("\t 'c' - use colorwheel colormap [default]\n");
- printf("\t 'n' - use default colormap [cannot be rotated]\n");
- printf("\t 's' - use stripe colorwheel colormap\n");
- printf("\t 'a' - use non-green colormap\n");
- printf("\t 'R' - toggle colormap rotation\n");
- printf("\t '1'..'9' - change colormap rotation speed\n");
- printf("\t 'x' - reverse colormap rotate direction\n");
- printf("\t 'd' - dump current fractal to file \"mandel.xwd\"\n");
- printf(
- "\t space - double K value (depth of calculation) [default %d]\n",
- 128);
- printf("\t 'i' - toggle between generation algorithms\n");
- printf("\t 'q' - quit program\n");
- }
-
- static void
- NewColormap(
- image_data_t *data,
- int color)
- {
- data->cm_current = color;
- XSetWindowColormap(XtDisplay(data->area), XtWindow(data->toplevel),
- data->cmaps[data->cm_current]);
- if (data->run_work_proc && data->cm_current == CM_DEFAULT)
- {
- printf("Cannot rotate the default colormap Bucko!\n");
- printf("Switching to rainbow.\n");
- NewColormap(data, CM_RAINBOW);
- }
- else
- {
- XQueryColors(XtDisplay(data->area),
- data->cmaps[data->cm_current], data->colors,
- data->max_color);
- SetCursorColors(data);
- }
- }
-
- static void
- FlipRotate(
- image_data_t *data)
- {
- data->run_work_proc = ! data->run_work_proc;
- if (data->run_work_proc)
- {
- if (data->cm_current == CM_DEFAULT)
- {
- printf("Cannot rotate the default colormap Bucko!\n");
- printf("Switching to rainbow.\n");
- NewColormap(data, CM_RAINBOW);
- }
- XQueryColors(XtDisplay(data->area),
- data->cmaps[data->cm_current], data->colors,
- data->max_color);
- data->work_proc = XtAddWorkProc(RotateWorkProc, data);
- }
- else
- XtRemoveWorkProc(data->work_proc);
- }
-
- static void
- KeyPressFunc(
- Widget w,
- image_data_t *data,
- XEvent *event)
- {
- XKeyEvent *keyevent = (XKeyEvent *)event;
- unsigned char key;
- FILE *fp;
-
- if (XLookupString(keyevent, (char *)&key, sizeof(key), (KeySym *)0,
- (XComposeStatus *) 0) > 0)
- switch (key)
- {
- case '1' :
- case '2' :
- case '3' :
- case '4' :
- case '5' :
- case '6' :
- case '7' :
- case '8' :
- case '9' :
- NewRotateJumpCount(data, key - '1');
- break;
- case ' ' :
- data->K += data->K;
- printf("K=%d\n", data->K);
- fflush(stdout);
- (*data->create_image)(w, data);
- break;
- case 'n' :
- NewColormap(data, CM_DEFAULT);
- break;
- case 'r' :
- NewColormap(data, CM_RED);
- break;
- case 'g' :
- NewColormap(data, CM_GREEN);
- break;
- case 'b' :
- NewColormap(data, CM_BLUE);
- break;
- case 'c' :
- NewColormap(data, CM_RAINBOW);
- break;
- case 'm' :
- NewColormap(data, CM_MONO);
- break;
- case 's' :
- NewColormap(data, CM_STRIPE);
- break;
- case 'a' :
- NewColormap(data, CM_NOGREEN);
- break;
- case 'R' :
- FlipRotate(data);
- break;
- case 'x' :
- data->rotate_forward = ! data->rotate_forward;
- break;
- case 'd' :
- if ((fp = fopen("mandel.xwd", "w")) == NULL)
- {
- printf("I canna' open mandel.xwd, Captain!\n");
- fflush(stdout);
- return;
- }
- Window_Dump(data->toplevel, XtWindow(data->toplevel),
- fp);
- fclose(fp);
- break;
- case 'i' :
- if (data->create_image == CreateImage)
- {
- printf("Calculate each dot.\n");
- data->create_image = CreateImageOld;
- }
- else
- {
- printf("Fill rectangle areas of same color.\n");
- data->create_image = CreateImage;
- }
- break;
- case 'q' :
- exit(0);
- default :
- printf("I don't do %c\n", key);
- fflush(stdout);
- }
- }
-
- static GC
- CreateXorGC(
- Widget w)
- {
- XGCValues values;
- GC gc;
- Arg wargs[2];
-
- XtSetArg(wargs[0], XtNforeground, &values.foreground);
- XtSetArg(wargs[1], XtNbackground, &values.background);
- XtGetValues,(w, wargs, 2);
- values.foreground = values.foreground ^ values.background;
- /* values.line_style = LineOnOffDash; */
- values.line_style = LineSolid;
- values.function = GXxor;
- return XtGetGC(w, GCForeground | GCBackground | GCFunction |
- GCLineStyle, &values);
- }
-
- static void
- StartRubberBand(
- Widget w,
- image_data_t *data,
- XEvent *event)
- {
- XPoint corners[5];
-
- data->rubber_band.last_x = data->rubber_band.start_x = event->xbutton.x;
- data->rubber_band.last_y = data->rubber_band.start_y = event->xbutton.y;
- SetupCorners(corners, data);
- XDrawLines(XtDisplay(w), XtWindow(w), data->rubber_band.gc,
- corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
- }
-
- static void
- SetupCorners(
- XPoint *corners,
- image_data_t *data)
- {
- corners[0].x = data->rubber_band.start_x;
- corners[0].y = data->rubber_band.start_y;
- corners[1].x = data->rubber_band.start_x;
- corners[1].y = data->rubber_band.last_y;
- corners[2].x = data->rubber_band.last_x;
- corners[2].y = data->rubber_band.last_y;
- corners[3].x = data->rubber_band.last_x;
- corners[3].y = data->rubber_band.start_y;
- corners[4] = corners[0];
- }
-
- static void
- TrackRubberBand(
- Widget w,
- image_data_t *data,
- XEvent *event)
- {
- XPoint corners[5];
- int xdiff, ydiff, diff;
-
- SetupCorners(corners, data);
- XDrawLines(XtDisplay(w), XtWindow(w), data->rubber_band.gc,
- corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
- ydiff = event->xbutton.y - data->rubber_band.start_y;
- xdiff = event->xbutton.x - data->rubber_band.start_x;
- if (xdiff > ydiff)
- diff = ydiff;
- else
- diff = xdiff;
- data->rubber_band.last_x = data->rubber_band.start_x + diff;
- data->rubber_band.last_y = data->rubber_band.start_y + diff;
- if (data->rubber_band.last_y < data->rubber_band.start_y ||
- data->rubber_band.last_x < data->rubber_band.start_x)
- {
- data->rubber_band.last_y = data->rubber_band.start_y;
- data->rubber_band.last_x = data->rubber_band.start_x;
- }
- SetupCorners(corners, data);
- XDrawLines(XtDisplay(w), XtWindow(w), data->rubber_band.gc,
- corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
- }
-
- static void
- EndRubberBand(
- Widget w,
- image_data_t *data,
- XEvent *event)
- {
- XPoint corners[5];
- XPoint top, bot;
- double delta, diff;
-
- SetupCorners(corners, data);
- XDrawLines(XtDisplay(w), XtWindow(w), data->rubber_band.gc,
- corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
- /* printf("width=%d height=%d start_x=%d start_y=%d last_x=%d last_y=%d\n",
- data->width, data->height,
- data->rubber_band.start_x,
- data->rubber_band.start_y,
- data->rubber_band.last_x,
- data->rubber_band.last_y);
- fflush(stdout); */
- if (data->rubber_band.start_x >= data->rubber_band.last_x ||
- data->rubber_band.start_y >= data->rubber_band.last_y)
- return;
- top.x = data->rubber_band.start_x;
- bot.x = data->rubber_band.last_x;
- top.y = data->rubber_band.start_y;
- bot.y = data->rubber_band.last_y;
- diff = data->q_max - data->q_min;
- delta = (double)top.y / (double)data->height;
- data->q_min += diff * delta;
- delta = (double)(data->height - bot.y) / (double)data->height;
- data->q_max -= diff * delta;
- diff = data->p_max - data->p_min;
- delta = (double)top.x / (double)data->width;
- data->p_min += diff * delta;
- delta = (double)(data->width - bot.x) / (double)data->width;
- data->p_max -= diff * delta;
- printf("q_min=%2.12f q_max=%2.12f\np_min=%2.12f p_max=%2.12f\n\n",
- data->q_min, data->q_max, data->p_min, data->p_max);
- fflush(stdout);
- (*data->create_image)(w, data);
- }
-
- static void
- InitData(
- Widget toplevel,
- Widget w,
- image_data_t *data)
- {
- int n, i, i_inc, j, nitems, biggest_colormap;
- Arg wargs[32];
- XColor *colors;
- XVisualInfo *visual_list, visual_template;
-
- n = 0;
- XtSetArg(wargs[n], XtNwidth, &data->width); ++n;
- XtSetArg(wargs[n], XtNheight, &data->height); ++n;
- XtGetValues(w, wargs, n);
- data->area = w;
- data->max_color = XDisplayCells(XtDisplay(w),
- XDefaultScreen(XtDisplay(w)));
- data->gc = XCreateGC(XtDisplay(w), DefaultRootWindow(XtDisplay(w)),
- 0, (XGCValues *)0);
- data->pix = 0;
- data->p_min = data->ip_min;
- data->p_max = data->ip_max;
- data->q_min = data->iq_min;
- data->q_max = data->iq_max;
-
- data->toplevel = toplevel;
- data->cm_current = CM_RAINBOW;
- visual_template.class = PseudoColor;
- visual_list = XGetVisualInfo(XtDisplay(w), VisualClassMask,
- &visual_template, &nitems);
- if (! visual_list)
- {
- fprintf(stderr, "Unable to find PseudoColor visual!\n");
- exit(1);
- }
- biggest_colormap = 0;
- data->visual = (Visual *)NULL;
- for (i = 0; i < nitems; ++i)
- if (biggest_colormap < visual_list[i].colormap_size &&
- visual_list[i].colormap_size < MAXCOLOR)
- {
- biggest_colormap = visual_list[i].colormap_size;
- data->visual = visual_list[i].visual;
- }
- if (! data->visual)
- {
- fprintf(stderr,
- "Unable to find visual with colormap > 0 and < %d!\n",
- MAXCOLOR);
- exit(1);
- }
- for (i = 0; i < MAX_CMAPS - 1; ++i)
- data->cmaps[i] = XCreateColormap(XtDisplay(w),
- DefaultRootWindow(XtDisplay(w)), data->visual, AllocAll);
- colors = (XColor *)ALLOCATE_LOCAL(data->max_color * sizeof(XColor));
- i_inc = 65536 / data->max_color * 2;
- data->cmaps[CM_DEFAULT] = DefaultColormap(XtDisplay(w),
- DefaultScreen(XtDisplay(w)));
- SETUP_COLOR(w, red, green, blue, colors, data, i_inc, CM_RED);
- SETUP_COLOR(w, green, blue, red, colors, data, i_inc, CM_GREEN);
- SETUP_COLOR(w, blue, green, red, colors, data, i_inc, CM_BLUE);
- SetupRainbow(data->max_color, colors);
- XStoreColors(XtDisplay(w), data->cmaps[CM_RAINBOW], colors,
- data->max_color);
- SetupMonoCmap(data, colors, i_inc);
- SetupStripeCmap(data, colors);
- XStoreColors(XtDisplay(w), data->cmaps[CM_STRIPE], colors,
- data->max_color);
- NoGreenCmap(data, colors);
- DEALLOCATE_LOCAL((char *)colors);
- data->run_work_proc = FALSE;
- data->rotate_forward = TRUE;
- data->rotate_jump_count = 1;
- data->colors = (XColor *)malloc(data->max_color * sizeof(XColor));
- for (i = 0; i < data->max_color; ++i)
- data->colors[i].pixel = i;
- data->normal_cursor = XCreateFontCursor(XtDisplay(w), XC_crosshair);
- data->clock_cursor = XCreateFontCursor(XtDisplay(w), XC_watch);
- data->create_image = CreateImage;
- }
-
- static void
- HalfIntensity(
- unsigned short *color)
- {
- *color /= 1.5;
- }
-
- static void
- SetupStripeCmap(
- image_data_t *data,
- XColor *colors)
- {
- int i, half;
-
- SetupRainbow(data->max_color, colors);
- for (i = 1; i < data->max_color; i += 3)
- {
- HalfIntensity(&colors[i].red);
- HalfIntensity(&colors[i].green);
- HalfIntensity(&colors[i].blue);
- }
- }
-
- static void
- SetupRainbow(
- int ncells,
- XColor *colors)
- {
- int i;
- int hls[3], rgb[3];
-
- hls[1] = 500;
- hls[2] = 1000;
- colors[0].red = 0;
- colors[0].green = 0;
- colors[0].blue = 0;
- colors[0].flags = DoRed | DoGreen | DoBlue;
- for (i = 1; i < ncells; ++i)
- {
- hls[0] = 3600 * i / ncells;
- HLSToRGB(hls, rgb);
- colors[i].red = rgb[0];
- colors[i].green = rgb[1];
- colors[i].blue = rgb[2];
- colors[i].flags = DoRed | DoGreen | DoBlue;
- }
- }
-
- /*
- * NAME: hls2rgb() from foley and van dam, fundamentals of interactive ...
- * page 619
- *
- * PURPOSE: Convert hls[0..3600][0..1000][0..1000] space to rgb space
- * That is the Hue, Lightness, Saturation color model.
- * Which is two cones, base to base, the bottom tip is black, the
- * top tip is white, the middle (bases) around the outside is a color
- * wheel. The axis of this solid is Lightness. Hue is the angular
- * measure around the cones, and the saturation is the radius from the
- * axis towards the surface of the cones.
- */
- static void
- HLSToRGB(
- int *hue_light_sat,
- int *rgb) /* Each in range [0..65535] */
- {
- double r, g, b, h, l, s;
- double m1, m2;
-
- h = (double) hue_light_sat[0] / 10.0;
- l = (double) hue_light_sat[1] / 1000.0;
- s = (double) hue_light_sat[2] / 1000.0;
-
- if ( l < 0.5 )
- {
- m2 = l * ( 1.0 + s );
- }
- else
- {
- m2 = l + s - (l * s);
- }
- m1 = (2.0 * l) - m2;
- if ((s + 1.0) == 1.0 )
- {
- if ( (h + 1.0) < 1.0 )
- {
- r = g = b = l;
- }
- else
- {
- r = g = b = 0.0;
- }
- }
- else
- {
- r = HueValue( m1, m2, h + 120.0 );
- g = HueValue( m1, m2, h );
- b = HueValue( m1, m2, h - 120.0 );
- }
- rgb[0] = 65535.0 * r;
- rgb[1] = 65535.0 * g;
- rgb[2] = 65535.0 * b;
- if ( rgb[0] > 65535 )
- rgb[0] = 65535;
- else if ( rgb[0] < 0 )
- rgb[0] = 0;
-
- if ( rgb[1] > 65535 )
- rgb[1] = 65535;
- else if ( rgb[1] < 0 )
- rgb[1] = 0;
-
- if ( rgb[2] > 65535 )
- rgb[2] = 65535;
- else if ( rgb[2] < 0 )
- rgb[2] = 0;
- }
-
- static double
- HueValue(
- double n1,
- double n2,
- double hue)
- {
- if ( hue > 360.0 )
- hue -= 360.0;
- if ( hue < 0.0 )
- hue += 360.0;
- if ( hue < 60.0 )
- return n1 + ((n2 - n1) * hue / 60.0);
- else if ( hue < 180.0 )
- return n2;
- else if ( hue < 240.0 )
- return n1 + ((n2 - n1) * (240.0 - hue) / 60.0);
- else
- return n1;
- }
-
- void
- InitBuffer(
- image_data_t *data)
- {
- int i;
-
- if (data->max_color > MAXCOLOR)
- XtError("This display has too many colors (I'm sure!!)");
- for (i = 0 ; i < MAXCOLOR; ++i)
- Points->npoints[i] = 0;
- }
-
- void
- BufferRectangle(
- image_data_t *data,
- int color,
- int x0,
- int y0,
- int x1,
- int y1)
- {
- Widget w = data->area;
- int width = x1 - x0;
- int height = y1 - y0;
-
- if (width <= 0 || height <= 0)
- return;
- XSetForeground(XtDisplay(w), data->gc, color);
- if (XtIsRealized(w))
- XFillRectangle(XtDisplay(w), XtWindow(w), data->gc, x0, y0,
- width, height);
- XFillRectangle(XtDisplay(w), data->pix, data->gc, x0, y0, width,
- height);
- }
-
- void
- BufferPoint(
- Widget w,
- image_data_t *data,
- int color,
- int x,
- int y)
- {
- if (Points->npoints[color] == MAXPOINTS - 1)
- {
- XSetForeground(XtDisplay(w), data->gc, color);
- if (XtIsRealized(w))
- XDrawPoints(XtDisplay(w), XtWindow(w), data->gc,
- Points->data[color], Points->npoints[color],
- CoordModeOrigin);
- XDrawPoints(XtDisplay(w), data->pix, data->gc,
- Points->data[color], Points->npoints[color],
- CoordModeOrigin);
- Points->npoints[color] = 0;
- }
- Points->data[color][Points->npoints[color]].x = x;
- Points->data[color][Points->npoints[color]].y = y;
- ++Points->npoints[color];
- }
-
- void
- FlushBuffer(
- Widget w,
- image_data_t *data)
- {
- int color;
-
- for (color = 0; color < data->max_color; ++color)
- if (Points->npoints[color])
- {
- XSetForeground(XtDisplay(w), data->gc, color);
- if (XtIsRealized(w))
- XDrawPoints(XtDisplay(w), XtWindow(w), data->gc,
- Points->data[color], Points->npoints[color],
- CoordModeOrigin);
- XDrawPoints(XtDisplay(w), data->pix, data->gc,
- Points->data[color], Points->npoints[color],
- CoordModeOrigin);
- Points->npoints[color] = 0;
- }
- }
-
- static void
- Redisplay(
- Widget w,
- image_data_t *data,
- XmDrawingAreaCallbackStruct *call_data)
- {
- XExposeEvent *event = (XExposeEvent *)call_data->event;
-
- XCopyArea(XtDisplay(w), data->pix, XtWindow(w), data->gc, event->x,
- event->y, event->width, event->height, event->x, event->y);
- NewColormap(data, data->cm_current);
- }
-
- static void
- Resize(
- Widget w,
- image_data_t *data,
- caddr_t call_data)
- {
- int n;
- Arg wargs[32];
-
- n = 0;
- XtSetArg(wargs[n], XtNwidth, &data->width); ++n;
- XtSetArg(wargs[n], XtNheight, &data->height); ++n;
- XtGetValues(w, wargs, n);
- if (XtIsRealized(w))
- XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, TRUE);
- if (data->pix)
- XFreePixmap(XtDisplay(w), data->pix);
- data->pix = XCreatePixmap(XtDisplay(w), DefaultRootWindow(XtDisplay(w)),
- data->width, data->height, DefaultDepthOfScreen(XtScreen(w)));
- XSetForeground(XtDisplay(w), data->gc, BlackPixelOfScreen(XtScreen(w)));
- XFillRectangle(XtDisplay(w), data->pix, data->gc, 0, 0, data->width,
- data->height);
- (*data->create_image)(w, data);
- NewColormap(data, data->cm_current);
- }
-
- static Boolean
- RotateWorkProc(
- image_data_t *data)
- {
- int i, last, count;
- unsigned long tmppixel;
-
- if (! XtIsRealized(data->area))
- return FALSE;
- for (count = 0; count < data->rotate_jump_count; ++count)
- {
- if (data->rotate_forward)
- {
- tmppixel = data->colors[1].pixel;
- for (i = 2; i < data->max_color; ++i)
- data->colors[i - 1].pixel =
- data->colors[i].pixel;
- data->colors[data->max_color - 1].pixel = tmppixel;
- }
- else
- {
- last = data->max_color - 1;
- tmppixel = data->colors[last].pixel;
- for (i = data->max_color - 1; i >= 2; --i)
- {
- unsigned long ptmp;
-
- ptmp = data->colors[i - 1].pixel;
- data->colors[i].pixel = ptmp;
- }
- data->colors[1].pixel = tmppixel;
- }
- }
- XStoreColors(XtDisplay(data->toplevel), data->cmaps[data->cm_current],
- data->colors, data->max_color);
- SetCursorColors(data);
-
- return FALSE;
- }
-
- static void
- SetupMonoCmap(
- image_data_t *data,
- XColor *colors,
- int i_inc)
- {
- int i, j;
- Widget w = data->area;
-
- for (i = 0, j = 0; j < data->max_color / 2; ++j, i += i_inc)
- {
- colors[j].pixel = j;
- colors[j].red = i < 65536 ? i : 65535;
- colors[j].green = i < 65536 ? i : 65535;
- colors[j].blue = i < 65536 ? i : 65535;
- colors[j].flags = DoRed | DoGreen | DoBlue;
- }
- for (i = 65535, j = data->max_color / 2; j < data->max_color; ++j,
- i -= i_inc)
- {
- colors[j].pixel = j;
- colors[j].red = i;
- colors[j].green = i;
- colors[j].blue = i;
- colors[j].flags = DoRed | DoGreen | DoBlue;
- }
- XStoreColors(XtDisplay(w), data->cmaps[CM_MONO], colors,
- data->max_color);
- }
-
- static void
- NoGreenCmap(
- image_data_t *data,
- XColor *colors)
- {
- int step, i, leg, j;
-
- step = data->max_color / 3;
- leg = step;
- colors[0].red = 0;
- colors[0].green = 0;
- colors[0].blue = 0;
- colors[0].flags = DoRed | DoGreen | DoBlue;
- for (i = 1; i < leg; ++i)
- {
- colors[i].pixel = i;
- colors[i].red = fabs(65535 - (double)i / step * 65535.0);
- colors[i].blue = (double)i / step * 65535.0;
- colors[i].green = 0;
- colors[i].flags = DoRed | DoGreen | DoBlue;
- }
- for (j = 0, i = leg, leg += step; i < leg; ++i, ++j)
- {
- colors[i].pixel = i;
- colors[i].red = (double)j / step * 65535.0;
- colors[i].blue = 65535;
- colors[i].green = colors[i].red;
- colors[i].flags = DoRed | DoGreen | DoBlue;
- }
- for (j = 0, i = leg, leg += step; i < leg; ++i, ++j)
- {
- colors[i].pixel = i;
- colors[i].red = 65535;
- colors[i].blue = fabs(65535 - (double)j / step * 65535.0);
- colors[i].green = colors[i].blue;
- colors[i].flags = DoRed | DoGreen | DoBlue;
- }
- XStoreColors(XtDisplay(data->area), data->cmaps[CM_NOGREEN], colors,
- data->max_color);
- }
-
- static void
- NewRotateJumpCount(
- image_data_t *data,
- int count)
- {
- if (count <= 0)
- count = 1;
- else
- count *= (double)data->max_color / 50.0;
- data->rotate_jump_count = count;
- }
-